package org.jim.server.command.handler;

import org.jim.core.ImChannelContext;
import org.jim.core.ImPacket;
import org.jim.core.ImStatus;
import org.jim.core.exception.ImException;
import org.jim.core.packets.*;
import org.jim.core.protocol.IProtocol;
import org.jim.core.utils.JsonKit;
import org.jim.server.ImServerChannelContext;
import org.jim.server.JimServerAPI;
import org.jim.server.LML.LmlReqp;
import org.jim.server.command.AbstractCmdHandler;
import org.jim.server.processor.GetGroupListCmdProcessor;
import org.jim.server.processor.login.LoginCmdProcessor;
import org.jim.server.protocol.ProtocolManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 *  @author lml
 *  获取该用户下所有群信息
 */
public class GetGroupListByUserIdHandle extends AbstractCmdHandler {


    private static final Logger log = LoggerFactory.getLogger(GetGroupListByUserIdHandle.class);


    /**
     * 【返回处理 cmd 命令】
     * @return
     */
    @Override
    public Command command() {
        return Command.COMMAND_GET_GROUP_List_BY_USER;
    }

    @Override
    public ImPacket handler(ImPacket packet, ImChannelContext imChannelContext) throws ImException {

        // 记录登录消息命令操作的日志信息
        log.info("【lml 命令处理器】操作");

        ImServerChannelContext imServerChannelContext = (ImServerChannelContext)imChannelContext;
        /**
         * 将字节数据 反序列化为 ExitGroup 对象
         */
        GetGroupListBody getGroupListBody = JsonKit.toBean(packet.getBody(), GetGroupListBody.class);

        log.info("处理 lml 数据 GetGroupListBody：{}",getGroupListBody);

        // 获取登录命令处理器实例
        GetGroupListCmdProcessor getGroupListCmdProcessor = this.getSingleProcessor(GetGroupListCmdProcessor.class);

        // 创建一个成功的登录响应体
        GetGroupListResp resp = new GetGroupListResp();

        resp.setCommand(Command.COMMAND_SUCCESS);

        // 通过处理器获取信息
        List<Group> list = getList(imChannelContext, getGroupListCmdProcessor, getGroupListBody, resp);

        resp.setGroupList(list);

        // 获取当前连接使用的协议类型
//        IProtocol protocol = imServerChannelContext.getProtocolHandler().getProtocol();

//        resp.setTerminal(Objects.isNull(protocol) ? Protocol.UNKNOWN : protocol.name());

        // 绑定用户到当前服务器通道上下文
//        JimServerAPI.bindUser(imServerChannelContext, user);
//
//        // 初始化绑定或者解绑群组;
//        initGroup(imChannelContext, user);
//
//        // 登录成功后的处理操作
//        loginProcessor.onSuccess(user, imChannelContext);

        // 返回登录响应包
        return ProtocolManager.Converter.respPacket(resp, imChannelContext);
    }

    private List<Group> getList(ImChannelContext imChannelContext,
                         GetGroupListCmdProcessor loginProcessor,
                         GetGroupListBody loginReqBody,
                         GetGroupListResp loginRespBody)throws ImException{
        // 如果登录处理器为空，则直接根据请求体中的用户ID构建一个在线状态的User对象并返回
        if(Objects.isNull(loginProcessor)){

            log.info("LML 登录处理器为空，返回空数据");

            List<Group> lits = new ArrayList<>();

            return lits;
        }

        List<Group> list= loginProcessor.getList(loginReqBody, imChannelContext);

        // 如果登录响应体为空或登录失败，则记录错误日志，并执行登录失败后的处理逻辑
        if (Objects.isNull(loginRespBody) ) {
            log.error("响应处理错误！");
            return null;
        }
        // 如果登录成功，则调用自定义登录处理器的方法获取用户信息，并返回

        return list;
    }
}
